;======================================================================
;文件头
;======================================================================
    .INCLUDE "fc_menu_mapper.asm"
;======================================================================
;文件头配置
	.DEF NES_16KB_PRG_SIZE,		8
	.DEF NES_8KB_CHR_SIZE, 		3
	.DEF BANK_DATA_MASK,		NES_16KB_PRG_SIZE * 2 - 1     ;bank号掩码
	.DEF RESET_BANK,		NES_16KB_PRG_SIZE * 2 - 1
    .DEF RESET_ADDR,                    $F000   ;主程序起始地址
;======================================================================
	.DEF PRG_DATA_BANK_C000,	NES_16KB_PRG_SIZE * 2 - 2
	.DEF PRG_DATA_BANK_E000,	NES_16KB_PRG_SIZE * 2 - 1

	.DEF Mapper, 4
	.DEF FourScreen, 0 << 2		;四分屏幕，1为开启
	.DEF Trainer, 0 << 3		;是否开启Trainer，1为开启
	.DEF Battery_backed, 0 << 4	;是否开启SRAM，1为开启
	.DEF Mirroring, 0			;0为横向镜像，1为纵向

;工具宏
;==================================================
	.DEF BANK_16K_SIZE,	$4000
	.DEF BANK_8K_SIZE,	$2000
    
    .MACRO BANK_ORG_16K, _bank, _org
        .ORG _org
        .BASE $10 + ((_bank & BANK_DATA_MASK) * BANK_16K_SIZE) + (_org & $3FFF)
    .ENDM
    
    .MACRO BANK_ORG_8K, _bank, _org
        .ORG _org
        .BASE $10 + ((_bank & BANK_DATA_MASK) * BANK_8K_SIZE) + (_org & $1FFF)
    .ENDM
    
;--------------------------------------------------
;文本数据
    .MACRO STR, _str
            .DB end - start
        start
            .DB _str
        end
    .ENDM
  
;======================================================================
    .DEF MUSIN_DATA_BANK,             $00
    .DEF CUSTOM_DATA_BANK,            $03         ;自定义数据放置 bank 号
    .DEF CUSTOM_DATA_ADDR,            $A000       ;自定义数据地址
    .DEF MENU_DATA_BANK,              NES_16KB_PRG_SIZE * 2 - 3
    .DEF MENU_DATA_ADDR,              $8000   ;主程序起始地址
;======================================================================
    .DEF BACKGROUND_PATTERN_TABLE,    0           ;背景图案表(0: $0000; 1: $1000)
    .DEF SPRITE_PATTERN_TABLE,        1           ;精灵图案表(0: $0000; 1: $1000)
;======================================================================
    .DEF MULTICART_TYPE,              1       ;合卡类型 0: None 1: Coolboy 2: Coolgirl
    .DEF MENU_THEME,                  2       ;菜单主题 0: None 1: Contra 2: Rockman3
;======================================================================
;内存配置
    .DEF Use_Ram_Begin,               $40     ;菜单程序占用的内存起始地址
    .DEF Use_PPU_Buffer,              $0300   ;PPU缓冲占用的内存起始地址
    .DEF OAM_DMA_Buffer,              $0400   ;精灵缓冲地址

;==================================================
;静态文本写入控制常量
    .DEF STATIC_TEXT_VERTIVAL,        $80     ;静态文本纵向显示
    .DEF STATIC_TEXT_CENTER,          $40     ;静态文本居中显示
;======================================================================
    ;手柄按键常量
    .DEF JOY_KEY_UP,                  $08     ;上
    .DEF JOY_KEY_DOWN,                $04     ;下
    .DEF JOY_KEY_LEFT,                $02     ;左
    .DEF JOY_KEY_RIGHT,               $01     ;右
    .DEF JOY_KEY_SELECT,              $20     ;选择
    .DEF JOY_KEY_START,               $10     ;开始
    .DEF JOY_KEY_B,                   $40     ;B
    .DEF JOY_KEY_A,                   $80     ;A
    ;长按连发设置常量
    .DEF JOY_TURBO_TIME,              $20     ;触发连按阈值
    .DEF JOY_TURBO_INTERVAL,          $08     ;连发间隔时间, 越短越快
;==================================================
    .DEF TASK_ITEM_SELECT_ENABLE,     $80     ;启用输入
    .DEF TASK_CHR_UPDATE_ENABLE,      $40     ;启用CHR更新
    .DEF TASK_PAL_UPDATE_ENABLE,      $20     ;启用调色板更新
    .DEF TASK_PAL_FADING_ENABLE,      $10     ;调色板正在渐变中
    .DEF TASK_PAGING_ENABLE,          $08     ;菜单正在更新中
    .DEF TASK_CURSOR_ENABLE,          $04     ;启用光标显示
    .DEF TASK_START_READY,            $02     ;进入游戏就绪
    
    .ENUM Use_Ram_Begin
        ;==================================================
        FC_Data_Index_L,                1       ;数据索引低位
        FC_Data_Index_H,                1       ;数据索引高位
        FC_Data_Addr_L,                 1       ;数据地址低位
        FC_Data_Addr_H,                 1       ;数据地址高位
        FC_Data_Temp_L,                 1       ;数据临时低位
        FC_Data_Temp_H,                 1       ;数据临时高位
        FC_Data_Count,                  1       ;数据计数用
        FC_Data_Temp,                   1       ;数据计数用
        FC_Data_Char_Index,             1       ;
        FC_Bank_Bak_8000,               1       ;bank号备份8000
        FC_Bank_Bak_A000,               1       ;bank号备份A000

        ;==================================================
        ;按键配置
        FC_Gamepad_Keep,                2       ;长按状态
        FC_Gamepad_Once,                2       ;单次按下
        FC_Gamepad_Temp,                2       ;按键缓冲
        FC_Gamepad_Buf,                 2       ;按键缓冲
        FC_Gamepad_Status,              2       ;按键读取状态
        FC_Gamepad_Ready_Turbo,         2       ;按键按住连发
        ;==================================================
        ;翻页配置
        FC_Page_Last_Index,             1       ;上次页面索引
        FC_Page_Cur_Index,              1       ;当前页面索引
        FC_Page_Item_Index,             1       ;当前页的节目索引(当前页的第几个节目)
        FC_Item_Index,                  1       ;当前节目索引
        FC_Item_Index_H,                1       ;当前节目索引
    .ENDE
    
    .DEF FC_Item_Index_L,                FC_Item_Index       ;当前节目索引

    .ENUM Use_PPU_Buffer
        ;==================================================
        ;PPU配置
        FC_PPU_Buf_Addr,                $C0     ;PPU数据缓冲地址
        FC_PPU_Pal_Addr,                $20     ;PPU调色板缓冲地址
        FC_CHR_Buf_Addr,                $06     ;CHR缓冲
        FC_PPU_Mask_Buf,                1       ;PPU显示掩码缓冲
        FC_PPU_Buf_Count,               1       ;PPU数据缓冲待处理数据量
        FC_PPU_Item_Count,              1       ;PPU处理任务条目数
        FC_Wait_Time_Delay,             1       ;等待时长(等待期间禁用手柄输入)
        FC_Bkg_Pal_Index,               1       ;背景调色板索引
        FC_Sp_Pal_Index,                1       ;精灵调色板索引
        FC_Chr_Index,                   1       ;CHR更新索引
        FC_Bkg_Pal_Time,                1       ;背景调色板更新延时
        FC_Sp_Pal_Time,                 1       ;精灵调色板更新延时
        FC_Chr_Time,                    1       ;CHR更新延时
        FC_Nmi_Task_Flags,              1       ;PPU处理任务状态
    .ENDE
    
    .DEF FC_PPU_Bkg_Pal_Addr,       FC_PPU_Pal_Addr     ;背景调色板缓冲地址
    .DEF FC_PPU_Sp_Pal_Addr,        FC_PPU_Bkg_Pal_Addr + $10     ;精灵调色板缓冲地址
;==================================================
;小写字符转大写字符宏
    .MACRO CONVERT_TO_UPPERCASE
            ;当字符 >= 'a' 并且 <= 'z' 时转换为大写 
            CMP #$61
            BCC Convert_End
            CMP #$7A
            BEQ Convert_Char
            BCS Convert_End
        ;转大写, 翻转 D5 位即可
        Convert_Char
            EOR #$20
        Convert_End
    .ENDM
